import mitt from "mitt";
import { EnumEvent } from "xcore/cmpnt";

// 创建事件发射器实例
const emitter = mitt();

/**
 * 发送 "Ready" 事件，表示系统或组件已准备就绪
 * @param args 可变参数，表示事件传递的多个数据
 */
export function emitReady(...args: any) {
    // 触发 "Ready" 事件，并将多个参数包装成数组传递
    emitter.emit(EnumEvent.Ready, args);
}

/**
 * 监听 "Ready" 事件
 * @param handler 事件处理函数，当 "Ready" 事件触发时调用
 */
export function onReady(handler: (...args: any[]) => void) {
    // 监听 "Ready" 事件，并将数组解构为多个参数传递给回调函数
    emitter.on(EnumEvent.Ready, (args: any) => {
        handler(...args);
    });
}

/**
 * 发送 "Login" 事件，表示用户登录事件
 * @param args 可变参数，表示事件传递的多个数据
 */
export function emitLogin(...args: any[]) {
    // 触发 "Login" 事件，并将多个参数包装成数组传递
    emitter.emit(EnumEvent.Login, args);
}

/**
 * 监听 "Login" 事件
 * @param handler 事件处理函数，当 "Login" 事件触发时调用
 */
export function onLogin(handler: (...args: any[]) => void) {
    // 监听 "Login" 事件，并将数组解构为多个参数传递给回调函数
    emitter.on(EnumEvent.Login, (args: any) => {
        handler(...args);
    });
}

/**
 * 发送表单结果事件
 * @param tableId 表格的唯一标识符，用于区分不同表格的事件
 * @param args 可变参数，表示事件传递的多个数据
 */
export function emitFormQueryResult(tableId: string, ...args: any[]) {
    // 触发指定表格的表单结果事件，并将多个参数包装成数组传递
    emitter.emit(`FORM-RESULT-TABLE:${tableId}`, args);
}

/**
 * 监听表单结果事件
 * @param tableId 表格的唯一标识符，用于区分不同表格的事件
 * @param handler 事件处理函数，当表单结果事件触发时调用
 */
export function onFormQueryResult(tableId: string, handler: (...args: any[]) => void) {
    // 监听指定表格的表单结果事件，并将数组解构为多个参数传递给回调函数
    emitter.on(`FORM-RESULT-TABLE:${tableId}`, (args: any) => {
        handler(...args);
    });
}

/**
 * 发送表单查询事件
 * @param tableId 表格的唯一标识符，用于区分不同表格的事件
 * @param args 可变参数，表示事件传递的多个数据
 */
export function emitFormQueryRequest(tableId: string, ...args: any[]) {
    // 触发指定表格的表单查询事件，并将多个参数包装成数组传递
    emitter.emit(`FORM-QUERY-TABLE:${tableId}`, args);
}

/**
 * 监听表单查询事件
 * @param tableId 表格的唯一标识符，用于区分不同表格的事件
 * @param handler 事件处理函数，当表单查询事件触发时调用
 */
export function onFormQueryRequest(tableId: string, handler: (...args: any[]) => void) {
    // 监听指定表格的表单查询事件，并将数组解构为多个参数传递给回调函数
    emitter.on(`FORM-QUERY-TABLE:${tableId}`, (args: any) => {
        handler(...args);
    });
}

/**
 * 请求页面交换数据
 * @param unqId 唯一标识符，用于区分不同的数据请求
 * @param handler 数据返回时的处理函数
 */
export function requestSwapData(handler: (...args: any[]) => void,unqId?: string) {
    // 监听指定唯一标识符的数据返回事件
    unqId = unqId || "DEFAULT"
    emitter.off(`PAGE-SWAP-DATA-RESULT:${unqId}`)
    emitter.on(`PAGE-SWAP-DATA-RESULT:${unqId}`, (args: any) => {
        handler(args);
    });

    // 触发指定唯一标识符的数据请求事件
    emitter.emit(`PAGE-SWAP-DATA-GET:${unqId}`, []);
}

/**
 * 监听页面交换数据请求
 * @param unqId 唯一标识符，用于区分不同的数据请求
 * @param handler 数据请求时的处理函数，返回请求的数据
 */
export function onSwapData(handler: (...args: any[]) => any,unqId?: string) {
    // 监听指定唯一标识符的数据请求事件
    unqId = unqId || "DEFAULT"
    emitter.off(`PAGE-SWAP-DATA-GET:${unqId}`)
    emitter.on(`PAGE-SWAP-DATA-GET:${unqId}`, (args: any) => {
        // 调用处理函数获取数据
        let data = handler(...args);
        if(data instanceof Promise){
            data.then((res)=>{
                emitter.emit(`PAGE-SWAP-DATA-RESULT:${unqId}`, res);
            })
            return
        }
        // 触发数据返回事件，传递获取的数据
        emitter.emit(`PAGE-SWAP-DATA-RESULT:${unqId}`, data);
    });
}

/**
 * 请求页面交换数据
 * @param unqId 唯一标识符，用于区分不同的数据请求
 * @param handler 数据返回时的处理函数
 */
export function requestFormData(handler: (...args: any[]) => void,unqId?: string) {
    // 监听指定唯一标识符的数据返回事件
    unqId = unqId || "DEFAULT"
    emitter.off(`PAGE-FORM-DATA-RESULT:${unqId}`)
    emitter.on(`PAGE-FORM-DATA-RESULT:${unqId}`, (args: any) => {
        handler(args);
    });

    // 触发指定唯一标识符的数据请求事件
    emitter.emit(`PAGE-FORM-DATA-GET:${unqId}`, []);
}

/**
 * 监听页面交换数据请求
 * @param unqId 唯一标识符，用于区分不同的数据请求
 * @param handler 数据请求时的处理函数，返回请求的数据
 */
export function onFormData(handler: (...args: any[]) => any,unqId?: string) {
    // 监听指定唯一标识符的数据请求事件
    unqId = unqId || "DEFAULT"
    emitter.off(`PAGE-FORM-DATA-GET:${unqId}`)
    emitter.on(`PAGE-FORM-DATA-GET:${unqId}`, (args: any) => {
        // 调用处理函数获取数据
        let data = handler(...args);
        if(data instanceof Promise){
            data.then((res)=>{
                emitter.emit(`PAGE-FORM-DATA-RESULT:${unqId}`, res);
            })
            return
        }
        // 触发数据返回事件，传递获取的数据
        emitter.emit(`PAGE-FORM-DATA-RESULT:${unqId}`, data);
    });
}